//  timestamp 时间戳 
//  verificationStr 随机16位字符串 
//  sign  MD5生成
import md5 from 'js-md5';
import qs from 'qs'
function randomString() {
  var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
    a = t.length,
    n = "";
  for (let i = 0; i < 16; i++) n += t.charAt(Math.floor(Math.random() * a));
  return n
}
// 后端提供
const only = '@5984149117_@CJIQUELOJB_@9652147852_#END';//普通接口请求的KEY，
const business = '@6948711674_@LSKIQUWEBX_@6589544811_#END';//业务接口请求的KEY，
/**
 * 判断是否为空
 */
function empty(value: any) {
  switch (typeof value) {
    case 'undefined':
      return true;
    case 'string':
      if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true;
      break;
    case 'boolean':
      if (!value) return true;
      break;
    case 'number':
      // if (0 === value || isNaN(value)) return true;
      if (isNaN(value)) return true;
      break;
    case 'object':
      if (null === value || value.length === 0) return true;
      for (var i in value) {
        return false;
      }
      return true;
  }
  return false;
}

/**
 * 是否对象
 */
function object(value: any) {
  return Object.prototype.toString.call(value) === '[object Object]';
}
// 业务签名 字典排序 生成字符串
const ObjSort = function (arys: any) {
  var str = "", newStr = "";
  // 判断是否为formData实例
  if (object(arys)) {
    //先用Object内置类的keys方法获取要排序对象的属性名，再利用Array原型上的sort方法对获取的属性名进行排序，newkey是一个数组
    var newkey = Object.keys(arys).sort();
    for (var i = 0; i < newkey.length; i++) {
      if (!empty(arys[newkey[i]])) {
        str += newkey[i] + "=" + arys[newkey[i]] + '&'
        //向新创建的对象中按照排好的顺序依次增加键值对
      }
    }
    newStr = md5(str + business).toLowerCase()
  } else {
    newStr = md5(business).toLowerCase()
  }
  return newStr;
}
const configure = function (config: any) {
  // 时间戳
  const timestamp = new Date().getTime();//获取时间戳
  const verificationStr = randomString();//获取16位随机字符串
  const sign_ordinary = md5(verificationStr + only + timestamp).toLowerCase(); //普通接口签名
  config.header.timestamp = timestamp //时间戳
  config.header.verificationStr = verificationStr //16位随机字符串
  config.header.apiSign = sign_ordinary //MD5加密字符串 
  config.header.verificationCodeKey = uni.getStorageSync("verificationCodeKey");
  if (config.header['Content-Type'] == 'application/json') {
    config.header.parameterSign = ObjSort(config.params)
  } else {
    // 业务签名
    if (config.type == "post") {
      config.header.parameterSign = ObjSort(qs.parse(config.data))
    } else if (config.type == "get") {
      config.header.parameterSign = ObjSort(config.data)
    }
  }
  return config
}
export default {
  configure
}